"use strict"
const http = require('http');
const fs = require('fs');
const path = require('path');

const util = require('./src/util.js');
const pkg = require('./package.json');
const Config = require('./config.json');

exports.name = pkg.name;
exports.desc = pkg.description;
exports.options = {
  // '-h'               : 'print this help message',
  '--fetch': pkg.description,
  '--fetch @<a tag name>': '按标签分类拉取配置，如：@audit',
  '--view <a media name>': '查看指定 RD 哥哥的开发机配置',
  '--scan <a media name>': '模糊查找开发机配置',
  '--visit <a media name>': '访问指定 RD 哥哥的开发机页面',
  '--set-url <http link url>': '设置获取配置的接口地址'
};

// 拉取接口数据(返回 json 为 string)
const fetchData = (url) => {
  return new Promise((resolve, reject) => {
    let chunk = '';
    http.get(url, res => {
      res.on('data', (rs) => {
        chunk += rs;
      }).on('end', () => {
        const response = JSON.parse(chunk);
        const data = util.parserConfig(response);
        resolve(data);
      }).on('error', (e) => {
        reject(e);
      });
    });
  });
};

const fetchDataByTag = (tag, urlPrefix = Config.url) => {
  const url = urlPrefix + (tag ? '/' + tag : '');
  return fetchData(url);
};

// 拉取，写入本地
const writeDeployHosts = (tag, urlPrefix = Config.url) => {
  return fetchDataByTag(tag, urlPrefix).then(data => {
    util.writeFisConfig(data);
    util.colorPrint(data);
    return data;
  });
};

// 对外暴露（JSON.parse()处理）
exports.fetchData = (url) => {
  return fetchData(url).then(data => {
    return JSON.parse(data);
  });
};

// 对外支持覆盖 `Config.url`，以防 url 变更，本模块无法及时更新
exports.fetchDataByTag = (tag, urlPrefix = Config.url) => {
  const url = urlPrefix + (tag ? '/' + tag : '');
  return exports.fetchData(url);
};

exports.run = function (argv, cli) {
  // 如果输入为 fis3 foo -h
  // 或者 fis3 foo --help
  // 则输出帮助信息。
  if (argv.h || argv.help) {
    return cli.help(exports.name, exports.options);
  }
  var fetchUrl = argv['set-url'];

  if (fetchUrl) {
    //write config
    console.log(fetchUrl);
    var content = JSON.stringify({
      url: fetchUrl
    }, null, '\t');
    fs.writeFile(path.resolve(__dirname, './config.json'), content, function (err) {
      if (err) {
        throw err;
      }
    });
  }

  // 抓取接口 hosts 信息
  else if (argv.fetch) {
    var tagStr = argv.fetch;
    var tag = ''; // 按照 tag 来查询
    if (tagStr && tagStr.length > 1 && tagStr.charAt(0) === '@') {
      // console.log(tagStr);
      tag = tagStr.slice(1);
    }
    writeDeployHosts(tag).then(() => {
      console.log(`Fetch ${tag ? tagStr : ''} 'success! (${pkg.name} v${pkg.version})`);
    });
    return;
  } else if (argv.visit) {
    var url = util.getRdHostVisitURL(argv.visit);
    console.log('访问地址:', url);
    util.openBrowser(url);
  } else if (argv.view) {
    util.view(argv.view);
  } else if (argv.scan) {
    util.scan(argv.scan);
  }
};